플랏 | 애니메이션

matplotlib
Author

강신성

Published

November 16, 2023

matplotlibanimation 모듈을 통해 플랏 애니메이션을 만들어보자!

해당 포스트는 전북대학교 통계학과 최규빈 교수님의 강의내용을 토대로 재구성되었음을 알립니다.

1. 라이브러리 imports

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation
import IPython

2. FuncAnimation

A. 모티브


k = 6
x = np.linspace(0, 10, 100)
y = np.sin(0.1*k*x)

plt.plot(x, y)
plt.show()

\(k = 1, 2, 3, \dots\)로 바꾸면서 변화하는 그림을 연속으로 출력되게 하여 애니메이션으로 보고 싶다. 따라서…

  1. 하나의 고정된 그림을 정의
  2. 그림 안의 내용물을 frame에 따라 바꾸는 동작을 정의

위 두 과정을 결합하는 전략을 생각해보자.

- 위 두 과정을 코드로 나타내면 아래와 같다.

k = 4  ## frame에 따라 달라지는 값
x = np.linspace(0, 10, 100)
y = np.sin(0.1*k*x)

fig = plt.figure()  ## 하나의 고정된 그림을 정의하는 코드
ax = fig.gca()  ## axes를 꺼내옴
ax.plot(x, y)  ## 고정된 그림에서 내용물을 frame에 따라 바꾸는 동작을 정의하는 코드

### B. Animation

- 하나의 고정된 그림을 정의하는 코드

fig = plt.figure()
<Figure size 640x480 with 0 Axes>

- 고정된 그림에서 내용물을 frame에 따라서 바꾸는 함수

def func(frame):
    ax = fig.gca()  ## axes를 가져옴
    ax.clear()  ## 사이클을 반복하기 전에 기존에 입력해뒀던 것을 지움. 아직 그려진 게 없으면 변화 X
    x = np.linspace(0, 10, 100)
    y = np.sin(0.1*frame*x)  ## frame에 따라서 달라지는 값
    ax.plot(x, y)  ## 고정된 그림에서 그 내용물을 frame에 따라서 바꾸는 코드

## 해당 함수에는 return이 필요없다.

- 위 두개를 결합하여 애니메이션으로 재생

ani = matplotlib.animation.FuncAnimation(
    fig, ## 하나의 고정된 그림
    func,  ## 내용물을 frame에 따라 바꾸는 동작
    frames = 50  ## frame의 갯수
)
display(IPython.display.HTML(ani.to_jshtml()))  ## 앞의 display는 생략해도 돌아감

ani를 javascript HTML 형식으로 바꾼 뒤, IPython을 통해 읽어왔음.